"""
argparse 是 Python 内置的一个用于命令项选项与参数解析的模块，通过在程序中定义好我们需要的参数，
argparse 将会从 sys.argv 中解析出这些参数，并自动生成帮助和使用信息。
当然，Python 也有第三方的库可用于命令行解析，而且功能也更加强大，比如 docopt，Click。

如下代码例子：
1.
命令行输入： python sys_argv/argparse_demo.py
输出：
Namespace(batch_size=8, data_path='./data', device='gpu', do_predict=False, do_train=False, init_checkpoint=None, learning_rate
=5e-05, max_seq_length=128, num_train_epochs=3, output_dir='./checkpoints', predict_data_file='./data/test_data.json', seed=42,
 warmup_ratio=0, weight_decay=0.0)

2.
命令行输入：python sys_argv/argparse_demo.py --data_path ./data_demo
输出：
Namespace(batch_size=8, data_path='./data_demo', device='gpu', do_predict=False, do_train=False, init_checkpoint=None, learning
_rate=5e-05, max_seq_length=128, num_train_epochs=3, output_dir='./checkpoints', predict_data_file='./data/test_data.json', see
d=42, warmup_ratio=0, weight_decay=0.0)

解释：
在第二次输入时我们传入了 '--data_path' 的参数为 './data_demo'
此时输出中的 Namespace 的 data_path 由默认的 ./data 已经改变为 ./data_demo


其它详细参数详细 Link：https://blog.csdn.net/qq_36653505/article/details/83788460
"""

import argparse

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument("--do_train", action='store_true', default=False, help="do train")
    parser.add_argument("--do_predict", action='store_true', default=False, help="do predict")
    parser.add_argument("--init_checkpoint", default=None, type=str, required=False,
                        help="Path to initialize params from")
    parser.add_argument("--data_path", default="./data", type=str, required=False, help="Path to data.")
    parser.add_argument("--predict_data_file", default="./data/test_data.json", type=str, required=False,
                        help="Path to data.")
    parser.add_argument("--output_dir", default="./checkpoints", type=str, required=False,
                        help="The output directory where the model predictions and checkpoints will be written.")
    parser.add_argument("--max_seq_length", default=128, type=int,
                        help="The maximum total input sequence length after tokenization. Sequences longer "
                             "than this will be truncated, sequences shorter will be padded.", )
    parser.add_argument("--batch_size", default=8, type=int, help="Batch size per GPU/CPU for training.", )
    parser.add_argument("--learning_rate", default=5e-5, type=float, help="The initial learning rate for Adam.")
    parser.add_argument("--weight_decay", default=0.0, type=float, help="Weight decay if we apply some.")
    parser.add_argument("--num_train_epochs", default=3, type=int, help="Total number of training epochs to perform.")
    parser.add_argument("--warmup_ratio", default=0, type=float, help="Linear warmup over warmup_ratio * total_steps.")
    parser.add_argument("--seed", default=42, type=int, help="random seed for initialization")

    # 此处添加的的 '-d' 为 '--device' 的简写
    # 即可以使用：
    # python sys_argv/argparse_demo.py -d cpu
    # 或
    # python sys_argv/argparse_demo.py --device cpu
    # 传入 device 的参数
    parser.add_argument("--device", "-d", type=str, default="gpu",
                        help="Which device do you wanna use to train, CPU or GPU?")

    args = parser.parse_args()
    print(args.device)
